<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>5.扩展特性与对象属性保护</title>
</head>
<body>
  <script>
    //使用 symbol 定义 key 时不会被 for in/of 遍历到
    let symbol = Symbol("这是一个Symbol");
    let hd = {
      name: "后盾人",
      [symbol]: "houdunren.com"
    }
    for(const key in hd){
      console.log(key); // 只能打印普通属性name
    }
    for(const key of Object.keys(hd)){
      console.log(key); // 只能打印普通属性name
    }
    // getOwnPropertySymbols 能返回对象的Symbol属性，但是不能返回普通属性
    for(const key of Object.getOwnPropertySymbols(hd)){
      console.log(key); // 只能打印Symbol ： Symbol(这是一个Symbol)
    }
    // Reflect.ownKeys(obj) 同时获得普通属性和Symbol属性
    for(const key of Reflect.ownKeys(hd)){
      console.log(key);// name, Symbol(这是一个Symbol)
    }

    // 利用Symbol的特点，私有化对象属性，让它不能被遍历
    let site = Symbol("这是一个Symbol");
    class User {
      constructor(name){
        this.name = name;
        this[site] = "后盾人"
      }
      getName(){
        return `${this[site]} ${this.name}`;
      }
    }
    let lisi = new User('李四');
    console.log(lisi.getName());//后盾人 李四
    for(const key in lisi) {
      console.log(key); //只能打印普通属性name
    }
  </script>
</body>
</html>